console.log('\x1b[31m块语句\x1b[0m');
var x = 1;
{
    var x = 2;
}
console.log(x);


console.log('\x1b[31mBoolean 对象的真和假\x1b[0m');
const b = new Boolean(false);
if (b) {
    console.log(`${b} 为真`);
}
if (b == true) {
    console.log(`${b} 为真`);
}
else if (b == false) {
    console.log(`${b} 为假`);
}
else {
    console.log('不明');
}
if (b === true) {
    console.log(`${b} 为真`);
}
else if (b === false) {
    console.log(`${b} 为假`);
}
else {
    console.log('不明');
}


console.log('\x1b[31mSwitch 分支\x1b[0m');
let 水果类型 = '柚子';
switch (水果类型) {
    case '橙子':
        console.log('橙子是 $0.5 一磅');
        break;
    case '苹果':
        console.log('苹果是 $0.32 一磅');
        break;
    case '香蕉': 
        console.log('香蕉是 $0.48 一磅');
        break;
    default:
        console.log(`对不起 ${水果类型} 卖完了`);
}


console.log('\x1b[31m异常处理\x1b[0m');
function 获取月份名称(月份) {
    月份--; // 用 0 - 11 表示 一 至 十二月
    const 月份列表 = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
    if (月份列表[月份]) {
        return 月份列表[月份];
    }
    else {
        throw new Error('无效的月份');
    }
}

let 我的月份 = 15
let 月份名称
try {
    月份名称 = 获取月份名称(我的月份);
}
catch(e) {
    月份名称 = '未知';
    // console.log(e);
    // console.error(e);
    console.error(e.name);
    console.error(e.message);
}
finally {
    console.log(月份名称)
}

function f() {
    try {
        console.log(0);
        throw 'bogus';
    }
    catch (e) {
        console.log(1);
        return true;
        console.log(2);
    }
    finally {
        console.log(3);
        return false;
        console.log(4);
    }
    console.log(5);
}
console.log(f());

function g() {
    try {
        throw 'bogus';
    }
    catch (e) {
        console.log('捕获内部的\"bogus\"');
        throw e;
    }
    finally {
        return false; // 覆盖 catch 的的抛出操作
    }
}

try {
    console.log(g());
}
catch (e) {
    console.log('捕获外部的"bogus"');
}
